package org.db.createsql;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

import org.apache.log4j.Logger;
import org.db.createdao.BaseDao;
import org.transmit.StartUtil;

/**
 * 
 * <p>Title: AbstrDao   </p>
 * <p>Description: 继承接口类  根据他的类型不同注入不同的实现方法</p>
 * <p>Copyright: Copyright (c) 2012</p>
 * <p>Company: prd</p>
 * <p>Create Date/Time: 2014年8月13日 下午9:00:13<p>
 * @author porridge
 * @version 1.0
 * @url www.prdblog.com
 *
 */
public class AbstrDao<T extends RealizeDaoInter> {
	
	public  final Logger log = Logger.getLogger(AbstrDao.class);
	
	private Class<T> clz=(Class<T>)((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
	
	protected T absDao;
	
	public AbstrDao(){
		String pack=clz.getName()+StartUtil.findDatabaseConfig().getDatacls()+"Impl";
		try {
			this.absDao=(T)Class.forName(pack).newInstance();;
		} catch (Exception e) {
			log.error("注入dao失败  "+pack);
			System.out.println();
			e.printStackTrace();
		}
	}
	/**
	 * 自带查询单个实体方法
	 * @param cls
	 * @param id
	 * @return
	 * @throws Exception
	 */
	public <T> T findPo(Class<?> cls,String id) throws Exception{
		return this.absDao.find(cls,id);
	}
	/**
	 * 删除对象
	 * @param obj
	 * @return
	 * @throws Exception
	 */
	public int delPo(Object obj) throws Exception{
		return this.absDao.dele(obj);
	}
	/**
	 * 修改对象
	 * @param obj
	 * @return
	 * @throws Exception
	 */
	public int updatePo(Object obj) throws Exception{
		return this.absDao.update(obj);
	}
	/**
	 * 保存一个对象
	 * @param obj
	 * @return
	 * @throws Exception 
	 */
	public String savePo(Object obj) throws Exception{
		return this.absDao.save(obj);
	}
}
